// 用户表

import { defineStore } from 'pinia';

// 1. 【关键修改】定义用户对象的接口，将所有属性设为可选
// 这与 Vue 3 响应式系统将属性变为可选的行为保持一致，从而避免类型冲突。
interface SysUser {
    id?: number | null;
    router?: string;
    token?: string;
    username?: string;
    password?: string;
    name?: string;
    age?: number | null;
    gender?: string;
    createTime?: string;
    updateTime?: string;
    imgUrl?: string;
    studengOrteacherId?: number | null;
}

export const useSysUserStore = defineStore('sysUser', {
    // 2. state 的类型定义可以保持不变，或者更简洁地写法
    state: (): { sysUser: SysUser[] } => ({
        sysUser: [], // 初始化为空数组
    }),
    actions: {

        /**
         * 根据传入的条件对象，筛选出所有匹配的用户
         * @param query 查询条件对象，例如 { name: '张', gender: 'male' }
         * @returns 返回一个包含所有匹配用户的新数组
         */
        findUsersByConditions(query: Partial<SysUser>): SysUser[] {
            // 1. 从 query 对象中过滤出有效（非空、非 undefined）的查询条件
            const activeConditions = Object.entries(query).filter(
                ([_, value]) => value !== null && value !== undefined && value !== ''
            );
            // 如果没有任何有效条件，则返回所有用户（或空数组，取决于业务需求）
            if (activeConditions.length === 0) {
                return [];
            }
            // 2. 使用数组的 filter 方法筛选用户
            return this.sysUser.filter(user => {
                // 3. 使用数组的 every 方法，确保用户对象满足所有 activeConditions
                return activeConditions.every(([key, value]) => {
                    // 4. 执行匹配
                    // user[key as keyof SysUser] 是类型安全的属性访问
                    // String() 确保比较的是字符串，避免类型不匹配（如数字 1 和字符串 '1'）
                    // .toLowerCase() 实现不区分大小写的匹配
                    // .includes() 实现模糊匹配
                    return String(user[key as keyof SysUser])
                        .toLowerCase()
                        .includes(String(value).toLowerCase());
                });
            });
        },

        /**
         * 设置或添加一个用户信息
         * 如果用户ID已存在，则更新该用户；否则，添加一个新用户。
         * @param userInfo - 完整的用户信息对象
         */
        setUserInfo(userInfo: SysUser) {
            // 查找用户是否已存在
            const existingUserIndex = this.sysUser.findIndex(user => user.id === userInfo.id);

            if (existingUserIndex !== -1) {
                // 如果存在，则更新该用户信息
                // 现在这行代码不会报错了，因为 SysUser 接口的属性是可选的，
                // 与 Vue 的响应式类型兼容。
                this.sysUser[existingUserIndex] = { ...userInfo };
            } else {
                // 如果不存在，则添加新用户
                this.sysUser.push({ ...userInfo });
            }
        },

        /**
         * 根据ID更新用户的部分信息
         * @param id - 要更新的用户ID
         * @param payload - 包含要更新字段的对象
         */
        updateUser(id: number, payload: Partial<SysUser>) {
            const userIndex = this.sysUser.findIndex(user => user.id === id);
            if (userIndex !== -1) {
                // 使用展开运算符合并现有对象和更新内容
                this.sysUser[userIndex] = { ...this.sysUser[userIndex], ...payload };
            }
        },

        /**
         * 根据ID移除一个用户
         * @param id - 要移除的用户ID
         */
        removeUser(id: number) {
            this.sysUser = this.sysUser.filter(user => user.id !== id);
        },

        /**
         * 清空所有用户信息
         */
        clearUsers() {
            this.sysUser = [];
        },

        /**
         * 根据用户名和密码验证用户登录
         * @param username - 用户名
         * @param password - 密码
         * @returns 如果匹配成功，返回用户对象；否则返回 undefined
         */
        login(username: string, password: string): SysUser | undefined {
            // 在本地存储的 sysUser 数组中查找用户
            // 注意：这里的 `user` 类型是 `SysUser | undefined`，因为 `find` 可能找不到
            const foundUser = this.sysUser.find(user =>
                user.username === username && user.password === password
            );

            // 如果找到了用户，返回该用户对象
            // 如果没找到，`foundUser` 会是 `undefined`，直接返回它即可
            return foundUser;
        },
    },
    // 持久化配置
    persist: true,
});
